package main

// 通常只发送channel类型和只接收channel类型，会被用作函数的参数类型或返回值，用于限制对channel内的操作，
// 或者是明确可对channel进行的操作的类型

import (
	"sync"
	"time"
)

// 生产者：生产的数据发送到channel
func produce(ch chan<- int) {
	for i := 0; i < 10; i++ {
		ch <- i + 1
		time.Sleep(time.Second)
	}

	// 生产者关闭 channel
	close(ch)
}

// 消费者：接收 channel 数据进行处理
func consume(ch <-chan int) {
	// 当 channel 空时阻塞等待
	for n := range ch {
		println(n)
	}
}

func main() {
	ch := make(chan int, 5)

	var wg sync.WaitGroup
	wg.Add(2)

	go func() {
		produce(ch)
		wg.Done()
	}()

	go func() {
		consume(ch)
		wg.Done()
	}()

	wg.Wait()

}
